#ifndef _NGX_GLOBAL_H_
#define _NGX_GLOBAL_H_

#include <signal.h>
#include "ngx_c_slogic.h"
#include "ngx_c_threadpool.h"
#include "ngx_c_memory.h"
#include "ngx_func.h"

// 运行日志相关 
typedef struct
{
	int    log_level;   //日志级别 或者日志类型，ngx_macro.h里分0-8共9个级别
	int    fd;          //日志文件描述符
} ngx_log_t;

// 配置项相关
typedef struct
{
	char ItemName[50];
	char ItemContent[500];
} CConfItem, *LPCConfItem;

// 以下是外部全局量声明，不是定义
extern size_t       g_argvneedmem; // argv内存大小
extern size_t       g_envneedmem;  // env环境变量内存大小
extern int          g_os_argc; 	   // argc参数数量
extern char         **g_os_argv;   // argv参数指针
extern char         *gp_envmem;    // 环境变量指针
extern ngx_log_t    ngx_log;	   // 日志结构体实例
extern int 		    g_daemonized;  // 是否以守护进程启动

extern pid_t        ngx_pid;	   // 当前进程id
extern pid_t        ngx_parent;	   // 当前进程父进程id
extern int          ngx_process;   // 进程类型
extern sig_atomic_t ngx_reap;      // 标记子进程是否改变
extern CThreadPool  g_threadpool; // 线程池

extern CLogicSocket g_socket;
extern int          g_stopEvent;


static void checkHeartCallback(void *tVal, void *ctx)
{
    LPSTRUC_MSG_HEADER tmpmsg = (LPSTRUC_MSG_HEADER)ctx;
    CMemory *p_memory = CMemory::GetInstance();

    if(tmpmsg->iCurrsequence == tmpmsg->pConn->iCurrsequence) //此连接没断
    {
        if (tmpmsg->pConn->isNeedResetHeart)
		{
			g_socket.mod_time_event(g_socket.getHeartTime(), tVal);
			tmpmsg->pConn->isNeedResetHeart = false;
		}
		else
		{
			lpngx_connection_t p_Conn = tmpmsg->pConn;
			ngx_log_stderr(0,"时间到不发心跳包，踢出去!");   //感觉OK
			g_socket.zdClosesocketProc(p_Conn);
			// 当前释放的内存是加入心跳检测队列中申请的
			p_memory->FreeMemory(tmpmsg);//内存要释放
		}
    }
    else //此连接断了
    {
        ngx_log_stderr(0,"心跳检测中连接已经断开");
        p_memory->FreeMemory(tmpmsg);//内存要释放
    }
}

#endif // _NGX_GLOBAL_H_
